Python 模型训练Yolov5环境搭建

模型训练yolov5环境搭建

本文将介绍yolov5从环境搭建到模型训练的整个过程

目录

1.anconda环境搭建
2.yolov5下载
3.素材整理
4.模型训练
5.效果预测

建议提前下载的一些工具或安装包
anconda下载地址:https://www.anaconda.com/products/individual#Downloads
yolov5源码下载地址:https://github.com/ultralytics/yolov5

1.anconda环境搭建

提醒:所有操作都是在anconda的yolo的环境下进行的,在创建yolo环境后,之后每次进入CMD都需要切换到yolo环境中去(否则进入默认的base环境中)

https://www.anaconda.com/products/individual#Downloads
下载对应版本anconda即可,这里不介绍anconda安装过程了。
安装可以参考:https://blog.csdn.net/qq_43674360/article/details/123396415

anconda安装好后,conda可以创建多个运行环境,默认是base环境。这里为yolo创建一个环境。
打开CMD命令行,为yolov5创建一个环境,注意这里用的python版本是3.8,版本过低后面可能会报错

1
conda create -n yolo python=3.8

执行

1
conda info -e

即可看到刚刚创建的yolo环境

1
2
3
4
5
6
7
8
D:\vsCodeWorkspace\python_test_20230415>conda info -e
# conda environments:
#
fl C:\Users\dell\.conda\envs\fl
mind07py375 C:\Users\dell\.conda\envs\mind07py375
myenv C:\Users\dell\.conda\envs\myenv
yolo C:\Users\dell\.conda\envs\yolo
base C:\python20230415\Anaconda3

执行

1
activate yolo

即可切换到的yolo环境下了。记住退出CMD或者切换CMD窗口之后,如果想要进入yolo环境,都需要运行activate yolo指令。不然默认是在base环境下。
除此之外,进行yolo模型训练代码的编写需要用到jupyter notebook,所以需要在yolo环境下进行安装

1
conda install jupyter notebook

安装完成之后,只需要在yolo环境下输入

1
jupyter notebook

就会打开notebook,自动跳转到浏览器,打开notebook界面,之后会在notebook里进行训练yolo模型

yolov5下载

下载yolov5源码:https://github.com/ultralytics/yolov5
解压,可以看到里面有requirements.txt文件,里面记录了需要安装的包,这个txt文件可以帮助一键下载这些依赖包。

文件夹里也包含了train.py文件,这个也接下来训练yolo模型需要用到的启动文件。

接着上面的requirement.txt,介绍如何安装里面需要安装的依赖。首先打开下载好的yolov5_master 文件夹,在上面输入cmd回车,可以直接在该文件夹目录下打开命令行。

在cmd命令行打开之后,大家千万记得要切换到的yolo环境下,不然就安装到base环境中去了。

1
activate yolo

然后运行

1
pip install -r requirements.txt

就会自动把这些依赖安装好了。接下来开始训练yolo模型了。

整理yolov5模型

为了完成训练工作,需要将训练的图片按照指定的格式进行整理,
详细参照yolov5官方指南:
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

这里也简要介绍一遍过程,然后也为大家避坑,在训练前首先需要采集图片样本,然后再对图片中的待识别物体进行标注。
首先需要建立如下的文件夹images,labels和A.yaml文件:
D:\VSCODEWORKSPACE\PYTHON_TEST_20230415\YOLO_A
├─images
└─labels
└─A.yaml
所有文件放在yolo_A文件夹下,子文件夹images用来存放样本图片,labels文件夹用来存储标注信息。A.yaml文件用来存放一些目录信息和标志物分类。

这次测试的检测哆啦A梦的头像,采集了50张哆啦A梦的样本,放到images文件夹下:

图片的标注

接下来就要进行图片的标注工作了,图片标注用到了一个名为labelimg的工具:
https://github.com/tzutalin/labelImg
大家下载解压之后,首先要做的是删除
labelImg-master\data\predefined_classes.txt
txt文件中的内容,不然等会标记的时候会自动添加一些奇怪的类别。

然后在labelImg-master文件夹下打开cmd,进入的yolo环境中,然后还需要在yolo环境中安装一些labelimg运行需要的依赖,依次输入

1
2
3
4
activate yolo
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc

现在,已经在yolo环境中安装好labelimg的依赖环境了,输入

1
python labelimg.py

即可进入的界面中来。进入之后,首先先把一些选项勾上,便于标记。
然后,最重要的是把标记模式改为yolo。

1
2
3
4
5
6
7
8
View 中标记前五个
Auto Save mode
Single Class mode
Display Labels
Show/Hide Label Panel
Advanced Mode

在保存下面的标记模式改为yolo

之后点击Open dir选择图片所在的images文件夹,选择之后会弹窗让你选择labels所在的文件夹。当然如果选错了,也可以点change save dir进行修改。

然后软件右上角打开这个选项,当标记图片后,就会自动帮归类到A了

现在就可以开始进行标记了,常用的快捷键,用主要wad三个键

1
2
3
4
5
6
7
8
9
10
11
12
13
Ctrl + u	Load all of the images from a directory
Ctrl + r Change the default annotation target dir
Ctrl + s Save
Ctrl + d Copy the current label and rect box
Ctrl + Shift + d Delete the current image
Space Flag the current image as verified
w Create a rect box
d Next image
a Previous image
del Delete the selected rect box
Ctrl++ Zoom in
Ctrl-- Zoom out
↑→↓← | Keyboard arrows to move selected rect box

通过鼠标拖拽框选即可标注:

所有图片标注好之后,再来看的labels文件夹,可以看到很多txt文件。每个文件都对应着标记的类别和框的位置:

最后还要做的是建立yaml文件,文件的位置也不要放错:

文件里面内容如下,其中train和val都是images的目录,labels的目录不用写进去,会自动识别。nc代表识别物体的种类数目,names代表种类名称,如果多个物体种类识别的话,可以自行增加。

1
2
3
4
5
6
7
8
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../yolo_A/images/
val: ../yolo_A/images/
# number of classes
nc: 1

# class names
names: ['A meng']

到目前,的训练的图片材料就已经准备好了。

出现问题解决

labelImg闪退的高效解决方法
解决方法:
1.labelImg软件安装路径中不能出现中文路径,如果出现,换个英文的路径,(一般这样情况比较多)。
2.进入到C:\Users\Administrator,将.labelImgSettings.pkl文件删除,重新运行即可。(找不到可以目录下进行搜索)
3:使用labelImg 所在 anaconda 终端环境中依次执行以下命令
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple/
最后在中输入python labelimg.py启动。

yolov5模型训练

现在开始训练模型
首先进行模块导入

1
2
3
4
5
6
7
8
9
10
# 若是没有进行过下载,则进行下载yolov5源码进行
# git clone https://github.com/ultralytics/yolov5 # clone repo
# cd yolov5
# pip install -qr requirements.txt # install dependencies
# 云上环境需要,本地不需要进行,继续往后就行
# import torch
# from IPython.display import Image, clear_output # to display images

# clear_output()
# print('Setup complete. Using torch %s %s' % (torch.__version__, torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))

后把的的素材yolo_A文件夹放到yolov5根目录

然后一下代码可以测试能否正常工作,顺带会下载yolov5s.pt文件,这个文件后面训练的时候会用到

1
2
 python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source data/images/
# Image(filename='runs/detect/exp/zidane.jpg', width=600)

然后在 yolov5/runs/detect/exp 文件夹可以看到识别结果

接下来就要开始训练模型了:

1
python train.py --img 640 --batch 50 --epochs 100 --data ../yolo_A/A.yaml --weights yolov5s.pt --nosave --cache

注意:../yolo_A/A.yaml 路径按照需要的路径进行调整

训练完成后,们可以看到训练结果保存的位置:

在对应exp文件下可以看到用训练集做预测的结果:

1
Image(filename='runs/train/exp2/test_batch0_pred.jpg', width=800)  # test batch 0 predictions

现在们用训练出来的结果找一张网图做测试(文件名和导出预测文件地址不一定相同,但是相似,自行寻找)

1
2
python detect.py --weights /content/yolov5/runs/train/exp2/weights/best.pt --img 640 --conf 0.25 --source ../test2.jpg
#Image(filename='runs/detect/exp4/test2.jpg', width=600)

出现问题解决

DLL load failed: 页面文件太小,无法完成操作

需要把电脑无用程序都关闭。还有python.exe注意不能同时被2个程序使用,

提示页面文件太小,说明虚拟内存不够了,可以关掉一些进程,

或者把虚拟内存往大调一下(此处参考网上修改) http://www.nndssk.com/xtwt/122595A9Q5mb.html

OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading “C:\Users\dell.conda\envs\yolo\lib\site-packages\torch\lib\shm.dll” or one of its dependencies.

RuntimeError: [enforce fail at C:\actions-runner_work\pytorch\pytorch\builder\windows\pytorch\c10\core\impl\alloc_cpu.cpp:72] data. DefaultCPUAllocator: not enough memory: you tried to allocate 49152000 bytes.

修改train.py中 batchsize和worker,将数值减少,

1
2
3
4
5
6
7
8
9
10
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
#parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--batch-size', type=int, default=2, help='total batch size for all GPUs, -1 for autobatch')

parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
#parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--workers', type=int, default=2, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')

TabError: Inconsistent use of tabs and spaces in indentation

首先这个错误的意思是:在缩进的时候,使用了错误的空格和tab

造成这个错误的原因是代码前先用了空格然后再用tab完成了对齐,也就是说,这种错误产生的原因正是由于空格或者tab缩进造成的。

将空格删除,直接使用tab完成缩进,发现程序正常运行;

再试一下空格缩进,然后发现还是报错了,同样TabError: Inconsistent use of tabs and spaces in indentation。

注意,整个代码一定使用相同的,都用空格,或者都用tab

AssertionError: Label class 1 exceeds nc=1 in data/steel.yaml. Possible class labels are 0-0

仔细阅读报错内容可以发现:类别与标签序号不匹配(自定义数据集只有一类)
经过的仔细思考,猜测是在生成labels时出现了问题,通过阅读生成labels的脚本,找到问题如下:
查看 labels 首行首个字母是2 不是0 ,需要将2修改为 0

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

继开 wechat
欢迎加我的微信,共同交流技术